/*
 * 如果您想访问网站的租户级设置，可以使用站点设置（Site Settings）。这些是存储在ISite对象上的单例对象。
 * 如果要访问它们，需要使用ISiteService服务。这里还将演示如何添加与模块功能相关的站点设置对象。
 *
 * 主要功能：
 * - 演示站点设置的访问方式
 * - 展示自定义站点设置的用法
 * - 演示IOptions与站点设置的集成
 */

using Lombiq.TrainingDemo.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using OrchardCore.Settings;
using System.Threading.Tasks;

namespace Lombiq.TrainingDemo.Controllers;

/// <summary>
/// 站点设置控制器 - 演示Orchard Core站点设置的访问与集成
/// 
/// 主要用途：
/// - 访问和展示站点级设置
/// - 演示自定义站点设置的用法
/// - 展示IOptions与站点设置的集成
/// 
/// 使用场景：
/// - 获取站点名称
/// - 获取自定义站点设置内容
/// - 比较站点设置与IOptions的同步性
/// 
/// 设计原因：
/// - 展示Orchard Core站点设置的最佳实践
/// - 演示自定义设置对象的集成方式
/// - 提供配置与选项的统一访问方式
/// 
/// 设计模式：
/// - 依赖注入模式：通过构造函数注入ISiteService和IOptions
/// - 单例模式：站点设置为全局单例
/// - 配置模式：通过IOptions访问配置
/// </summary>
public sealed class SiteSettingsController : Controller
{
    private readonly ISiteService _siteService;
    private readonly DemoSettings _demoSettings;

    /// <summary>
    /// 构造函数 - 注入所需的服务依赖
    /// </summary>
    /// <param name="siteService">站点服务，用于访问站点设置</param>
    /// <param name="demoOptions">演示设置选项</param>
    public SiteSettingsController(ISiteService siteService, IOptionsSnapshot<DemoSettings> demoOptions)
    {
        _siteService = siteService;
        _demoSettings = demoOptions.Value;
    }

    /// <summary>
    /// 获取站点名称
    /// 
    /// 功能说明：
    /// - 通过ISiteService获取站点设置
    /// - 返回站点名称
    /// 
    /// 访问方式：
    /// - URL：/Lombiq.TrainingDemo/SiteSettings/SiteName
    /// </summary>
    /// <returns>站点名称字符串</returns>
    public async Task<string> SiteName() =>
        (await _siteService.GetSiteSettingsAsync()).SiteName;

    /// <summary>
    /// 获取自定义站点设置内容
    /// 
    /// 功能说明：
    /// - 通过ISiteService获取自定义设置对象
    /// - 通过IOptions获取设置内容
    /// - 比较两种方式的同步性
    /// 
    /// 访问方式：
    /// - URL：/Lombiq.TrainingDemo/SiteSettings/DemoSettings
    /// </summary>
    /// <returns>自定义设置内容字符串</returns>
    public async Task<string> DemoSettings()
    {
        // 通过ISiteService获取自定义设置对象。
        var messageFromSiteSettings = (await _siteService.GetSettingsAsync<DemoSettings>()).Message;

        // 通过IOptions获取设置内容。
        var messageFromOptions = _demoSettings.Message;
        // 这两者通常是同步的，因为IOptions也是从站点设置生成的。

        return $"Message from site settings: \"{messageFromSiteSettings}\". From options: \"{messageFromOptions}\"";
    }
}
